package com.nbsaas.boot.order.api.apis;

import com.nbsaas.boot.order.api.domain.response.OrderResponse;
import com.nbsaas.boot.rest.api.BaseApi;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单查询API接口
 * 使用Freemarker动态生成
 */
public interface OrderQueryApi extends BaseApi<OrderResponse, Object, Object> {

    /**
     * 根据店铺和状态查询订单
     * @param shopId 店铺ID
     * @param orderState 订单状态
     * @return 订单列表
     */
    @GetMapping("/orders/shop/{shopId}/state/{orderState}")
    List<OrderResponse> findOrdersByShopAndState(@PathVariable("shopId") Long shopId, 
                                                @PathVariable("orderState") Integer orderState);

    /**
     * 获取订单统计信息
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计结果
     */
    @GetMapping("/orders/statistics")
    Map<String, Object> getOrderStatistics(@RequestParam("shopId") Long shopId,
                                          @RequestParam("startDate") String startDate,
                                          @RequestParam("endDate") String endDate);

    /**
     * 根据客户查询订单
     * @param customerId 客户ID
     * @param shopId 店铺ID
     * @return 客户订单列表
     */
    @GetMapping("/orders/customer/{customerId}/shop/{shopId}")
    List<OrderResponse> findOrdersByCustomer(@PathVariable("customerId") Long customerId,
                                            @PathVariable("shopId") Long shopId);

    /**
     * 根据支付状态查询订单
     * @param payState 支付状态
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @return 支付订单列表
     */
    @GetMapping("/orders/pay-state/{payState}")
    List<Map<String, Object>> findOrdersByPayState(@PathVariable("payState") Integer payState,
                                                   @RequestParam("shopId") Long shopId,
                                                   @RequestParam("startDate") String startDate);

    /**
     * 按日期分组统计订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按日期分组的统计结果
     */
    @GetMapping("/orders/statistics/date")
    List<Map<String, Object>> getOrderStatisticsByDate(@RequestParam("shopId") Long shopId,
                                                       @RequestParam("startDate") String startDate,
                                                       @RequestParam("endDate") String endDate);

    /**
     * 查询使用优惠券的订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @return 优惠券使用订单列表
     */
    @GetMapping("/orders/coupon")
    List<Map<String, Object>> findOrdersWithCoupon(@RequestParam("shopId") Long shopId,
                                                   @RequestParam("startDate") String startDate);

    /**
     * 查询使用会员卡的订单
     * @param shopId 店铺ID
     * @return 会员卡使用订单列表
     */
    @GetMapping("/orders/vip-card")
    List<Map<String, Object>> findOrdersWithVipCard(@RequestParam("shopId") Long shopId);

    /**
     * 按来源统计订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按来源分组的统计结果
     */
    @GetMapping("/orders/statistics/source")
    List<Map<String, Object>> getOrderStatisticsBySource(@RequestParam("shopId") Long shopId,
                                                         @RequestParam("startDate") String startDate,
                                                         @RequestParam("endDate") String endDate);

    /**
     * 查询退款订单
     * @param shopId 店铺ID
     * @return 退款订单列表
     */
    @GetMapping("/orders/refund")
    List<Map<String, Object>> findRefundOrders(@RequestParam("shopId") Long shopId);

    /**
     * 查询使用积分的订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @return 积分使用订单列表
     */
    @GetMapping("/orders/integral")
    List<Map<String, Object>> findOrdersWithIntegral(@RequestParam("shopId") Long shopId,
                                                     @RequestParam("startDate") String startDate);

    /**
     * 查询使用红包的订单
     * @param shopId 店铺ID
     * @return 红包使用订单列表
     */
    @GetMapping("/orders/red-packet")
    List<Map<String, Object>> findOrdersWithRedPacket(@RequestParam("shopId") Long shopId);

    /**
     * 按小时统计订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按小时分组的统计结果
     */
    @GetMapping("/orders/statistics/hour")
    List<Map<String, Object>> getOrderStatisticsByHour(@RequestParam("shopId") Long shopId,
                                                       @RequestParam("startDate") String startDate,
                                                       @RequestParam("endDate") String endDate);

    /**
     * 按状态统计订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按状态分组的统计结果
     */
    @GetMapping("/orders/statistics/state")
    List<Map<String, Object>> getOrderStatisticsByState(@RequestParam("shopId") Long shopId,
                                                        @RequestParam("startDate") String startDate,
                                                        @RequestParam("endDate") String endDate);

    /**
     * 按支付方式统计订单
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按支付方式分组的统计结果
     */
    @GetMapping("/orders/statistics/pay-method")
    List<Map<String, Object>> getOrderStatisticsByPayMethod(@RequestParam("shopId") Long shopId,
                                                            @RequestParam("startDate") String startDate,
                                                            @RequestParam("endDate") String endDate);

    /**
     * 获取订单完成时间统计
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @return 订单完成时间统计
     */
    @GetMapping("/orders/complete-time")
    List<Map<String, Object>> getOrderCompleteTimeStatistics(@RequestParam("shopId") Long shopId,
                                                            @RequestParam("startDate") String startDate);

    /**
     * 动态条件查询订单
     * @param conditions 查询条件
     * @return 订单列表
     */
    @PostMapping("/orders/search")
    List<OrderResponse> findOrdersByConditions(@RequestBody Map<String, Object> conditions);

    /**
     * 获取店铺订单总数
     * @param shopId 店铺ID
     * @return 订单总数
     */
    @GetMapping("/orders/count/{shopId}")
    Long getOrderCountByShop(@PathVariable("shopId") Long shopId);

    /**
     * 获取店铺订单总金额
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 订单总金额
     */
    @GetMapping("/orders/total-amount")
    BigDecimal getOrderTotalAmount(@RequestParam("shopId") Long shopId,
                                  @RequestParam("startDate") String startDate,
                                  @RequestParam("endDate") String endDate);

    /**
     * 获取店铺已支付订单总金额
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 已支付订单总金额
     */
    @GetMapping("/orders/pay-amount")
    BigDecimal getOrderPayAmount(@RequestParam("shopId") Long shopId,
                                @RequestParam("startDate") String startDate,
                                @RequestParam("endDate") String endDate);

    /**
     * 获取店铺平均订单金额
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 平均订单金额
     */
    @GetMapping("/orders/average-amount")
    BigDecimal getOrderAverageAmount(@RequestParam("shopId") Long shopId,
                                    @RequestParam("startDate") String startDate,
                                    @RequestParam("endDate") String endDate);

    /**
     * 综合订单统计
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 综合统计结果
     */
    @GetMapping("/orders/comprehensive-statistics")
    Map<String, Object> getComprehensiveOrderStatistics(@RequestParam("shopId") Long shopId,
                                                       @RequestParam("startDate") String startDate,
                                                       @RequestParam("endDate") String endDate);
} 